Fix the logic in vcpu_sleep_sync(): we must wait until
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 13 Sep 2005 19:09:44 +0000 (19:09 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Tue, 13 Sep 2005 19:09:44 +0000 (19:09 +0000)
the running flag is cleared *and* the scheduler lock is
released. Not just one or the other.

Signed-off-by: Ryan Harper <ryanh@us.ibm.com>
xen/common/schedule.c

index ff9373d60f1687d92b7b1c71a29435f39f8391b5..77e0055e8c5b2d75901682dbfaf9a2685cbf37ea 100644 (file)
@@ -211,11 +211,12 @@ void vcpu_sleep_sync(struct vcpu *v)
 
     /*
      * We can be sure that the VCPU is finally descheduled after the running
-     * flag is cleared and the scheduler lock is released.
+     * flag is cleared and the scheduler lock is released. We also check that
+     * the domain continues to be unrunnable, in case someone else wakes it.
      */
-    while ( test_bit(_VCPUF_running, &v->vcpu_flags)
-            && !domain_runnable(v)
-            && spin_is_locked(&schedule_data[v->processor].schedule_lock) )
+    while ( !domain_runnable(v) &&
+            (test_bit(_VCPUF_running, &v->vcpu_flags) ||
+             spin_is_locked(&schedule_data[v->processor].schedule_lock)) )
         cpu_relax();
 
     sync_vcpu_execstate(v);